package com.tay.HDFS;

import java.io.FileNotFoundException;
import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.Before;
import org.junit.Test;

public class hdfsClient {
	// ========================================
	// ========================================
	// ========================================
	// ========================================
	// ========================================

	// FileSystem是hadoop集群中自带的类，主要提供了文件和文件夹操作的方法
	FileSystem fs;

	// 初始化方法，下文中每一次单元测试时，都会执行一次本方法
	@Before
	public void init() throws IOException {
		Configuration conf = new Configuration();
		conf.set("fs.defaultFS", "hdfs://mini1:9000/");
		fs = FileSystem.get(conf);
	}

	// ========================================
	// ========================================
	// ========================================
	// ========================================
	// ========================================

	// 增：创建一个文件（或目录）
	@Test
	public void CreateFile() throws IOException {
		Path p = new Path("/test/100.txt");
		fs.create(p, true);
		System.out.println("创建文件（或目录）成功。。。");
	}

	// 增：上传文件到HDFS上
	@Test
	public void PushFile() throws IOException {
		Path src = new Path("d://test123/aaa.txt");
		Path dst = new Path("/hadoop_test/input/aaa003.txt");
		fs.copyFromLocalFile(false, true, src, dst);
		System.out.println("上传文件到HDFS上成功。。。");
	}

	// ========================================
	// ========================================
	// ========================================
	// ========================================
	// ========================================

	// 删：删除一个文件（或目录）
	@Test
	public void DeleteFile() throws IOException {
		Path p = new Path("/test123");
		fs.delete(p);
		System.out.println("删除文件（或目录）成功。。。");
	}

	// ========================================
	// ========================================
	// ========================================
	// ========================================
	// ========================================

	// 查：读取文件内容
	@Test
	public void ReadFile() throws IOException {
		Path p = new Path("/flowsum/output/part-r-00000");
		if (fs.exists(p)) {
			FSDataInputStream is = fs.open(p);
			FileStatus status = fs.getFileStatus(p);
			byte[] buffer = new byte[Integer.parseInt(String.valueOf(status.getLen()))];
			is.readFully(0, buffer);
			System.out.println(buffer.toString());
		}
	}

	// 查：查询根目录下的所有文件
	public void QueryAll(Path p, FileSystem fs) throws FileNotFoundException, IOException {
		FileStatus[] status = fs.listStatus(p);
		for (int i = 0; i < status.length; i++) {
			if (status[i].isDir()) {
				Path p2 = new Path(status[i].getPath().toString());
				QueryAll(p2, fs);
			} else {
				System.out.println(status[i].getPath().toString());
			}
		}
	}

	// 调用QueryAll方法
	@Test
	public void testQueryAll() throws FileNotFoundException, IOException {
		Path p = new Path("/");
		QueryAll(p, fs);
	}

	// ========================================
	// ========================================
	// ========================================
	// ========================================
	// ========================================
}
